#!/usr/bin/env bash
# Program to output a system information page
PROGNAME=$(basename $0)
TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"

usage () {
    echo "$PROGNAME: usage: $PROGNAME [-f file | -i]"
    return
}

report_uptime () {
    #echo "Function report_uptime excuted."
    cat <<- _EOF_
        <H2>System Uptime</H2>
        <PRE>$(uptime)</PRE>
_EOF_
    return
}

report_disk_space () {
    #echo "Function report_disk_space excuted."
    cat <<- _EOF_
        <H2>Disk Space Utilization</H2>
        <PRE>$(df -h)</PRE>
_EOF_
    return
}

report_home_space () {
    local format="%8s%10s%10s\n"
    local i dir_list total_files total_dirs total_size user_name
    if [[ $(id -u) -eq 0 ]]; then
        dir_list=/home/*
        user_name="All Users"
    else
        dir_list=$HOME
        user_name=$USER
    fi
    echo "<H2>Home Space Utilization ($user_name)</H2>"
    for i in $dir_list; do
        total_files=$(find $i -type f | wc -l)
        total_dirs=$(find $i -type d | wc -l)
        total_size=$(du -sh $i | cut -f 1)
        echo "<H3>$i</H3>"
        echo "<PRE>"
        printf "$format" "Dirs" "Files" "Size"
        printf "$format" "----" "-----" "----"
        printf "$format" $total_dirs $total_files $total_size
        echo "</PRE>"
    done
    return
}

write_html_page() {
	# echo "string..."
	cat <<- _EOF_
	<HTML>
	    <HEAD>
	        <TITLE>$TITLE</TITLE>
	    </HEAD>
	    <BODY>
	        <H1>$TITLE</H1>
	        <P>$TIME_STAMP</P>
	        $(report_uptime)
	        $(report_disk_space)
	        $(report_home_space)
	    </BODY>
	</HTML>
_EOF_
}

# process command line options
interactive=
filename=
while [[ -n $1 ]]; do
	case $1 in
		-f | --file)
			shift
			filename=$1
			;;
		-i | --interactive)
			interactive=1
			;;
		-h | --help)
			usage
			exit
			;;
		*)
			usage >&2
			exit 1
			;;
	esac
	shift
done
# interactive mode
if [[ -n $interactive ]]; then
	while true; do
		read -p "Enter name of output file: " filename
		if [[ -e $filename ]]; then
			read -p "'$filename' exists. Overwrite? [y/n/q] > "
			case $REPLY in
				y|Y)
					break
					;;
				q|Q)
					echo "Program terminated."
					;;
				*)
					continue
					;;
			esac
		fi
	done
fi
# output html page
if [[ -n $filename ]]; then
	if touch $filename && [[ -f $filename ]]; then
		write_html_page > $filename
	else
		echo "$PROGNAME: cannot write file '$filename'" >&2	
		exit 1
	fi
else
	write_html_page
fi
